package com.bugstack.springframework.core.io;


import cn.hutool.core.lang.Assert;
import sun.net.www.protocol.http.HttpURLConnection;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

/**
 * Http方式读取网络文件
 */
public class UrlResource implements Resource {
    private final URL url;

    public UrlResource(URL url) {
        Assert.notNull(url,"url must not be null");
        this.url = url;
    }


    @Override
    public InputStream getInputStream() throws IOException {
        //使用 url.openConnection() 打开一个与 URL 之间的连接。
        URLConnection con = this.url.openConnection();
        try{
            InputStream inputStream = con.getInputStream();
            return inputStream;
        }catch (IOException ix){
            //首先检查 con 是否是 HttpURLConnection 的实例。这意味着当前连接是通过 HTTP 协议建立的。
            //当通过 HttpURLConnection 读取数据时，连接会保持打开状态，直到明确断开。如果出现异常且不及时断开连接，
            // 可能会导致资源泄漏（如未释放的网络连接和系统资源）。调用 disconnect 方法可以确保及时释放这些资源，避免潜在的资源泄漏问题。
            if(con instanceof HttpURLConnection){
                ((java.net.HttpURLConnection) con).disconnect();
            }
            throw  ix;
        }

    }
}

/**
 * 假设有一个网络资源 https://example.com/resource.txt，你可以这样使用 UrlResource 来加载这个文件：
 * try {
 *     URL url = new URL("https://example.com/resource.txt");
 *     UrlResource resource = new UrlResource(url);
 *     try (InputStream inputStream = resource.getInputStream()) {
 *         // 使用 inputStream 读取文件内容
 *         int data = inputStream.read();
 *         while (data != -1) {
 *             System.out.print((char) data);
 *             data = inputStream.read();
 *         }
 *     }
 * } catch (IOException e) {
 *     e.printStackTrace();
 * }
 */
